package com.renan.listener;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.watch.WatchMonitor;
import cn.hutool.core.io.watch.Watcher;
import cn.hutool.core.lang.Console;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.File;
import java.nio.file.Path;
import java.nio.file.WatchEvent;

/**
 * 时间监听器 监听文件夹
 *
 * @author 张亚林
 */
@Component
public class ZipFileWatchEvent {
  /** 压缩文件源目录 */
  @Value("${zip.file.absolute.source.path:/home/zsj/MRO}")
  private String filePath;

  /** CSV文件加工目录 */
  @Value("${csv.file.absolute.target.path:/home/zsj/MRO_CSV}")
  private String csvPath;

  public void initZip() {
      watchFile(filePath);
  }

  public void initCSV() {
      watchFile(csvPath);
  }

    private void watchFile(String csvPath) {
        File file = FileUtil.file(csvPath);
        // 这里只监听文件或目录的修改事件
        WatchMonitor watchMonitor = WatchMonitor.create(file, WatchMonitor.ENTRY_MODIFY);
        watchMonitor.setWatcher(new Watcher() {
            @Override
            public void onCreate(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                Console.log("创建：{}-> {}", currentPath, obj);
            }

            @Override
            public void onModify(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                Console.log("修改：{}-> {}", currentPath, obj);
            }

            @Override
            public void onDelete(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                Console.log("删除：{}-> {}", currentPath, obj);
            }

            @Override
            public void onOverflow(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                Console.log("Overflow：{}-> {}", currentPath, obj);
            }
        });

        // 设置监听目录的最大深入，目录层级大于制定层级的变更将不被监听，默认只监听当前层级目录
        watchMonitor.setMaxDepth(3);
        // 启动监听
        watchMonitor.start();
    }
}
